package com.cloud.picture.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloud.picture.common.BaseResponse;
import com.cloud.picture.model.dto.DeleteRequest;
import com.cloud.picture.model.dto.user.UserAddRequest;
import com.cloud.picture.model.dto.user.UserFollowRequest;
import com.cloud.picture.model.dto.user.UserInfoUpdateRequest;
import com.cloud.picture.model.dto.user.UserQueryRequest;
import com.cloud.picture.model.dto.user.message.MessageAddRequest;
import com.cloud.picture.model.dto.user.message.MessageListRequest;
import com.cloud.picture.model.entity.User;
import com.cloud.picture.model.vo.FollowerVO;
import com.cloud.picture.model.vo.LoginUserVO;
import com.cloud.picture.model.vo.MessageVO;
import com.cloud.picture.model.vo.UserVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @author win
* @description 针对表【user(用户)】的数据库操作Service
* @createDate 2025-03-01 10:37:39
*/
public interface UserService extends IService<User> {

    /**
     * 发送邮箱验证码
     * @param email 邮箱
     * @return 邮箱验证码
     */
    BaseResponse<Boolean> sendVerificationCode(String email);

    /**
     * 验证邮箱验证码
     * @param email 邮箱
     * @param code 验证码
     * @return 校验
     */
    Boolean verifyCode(String email, String code);

    /**
     * 用户邮箱注册
     * @param userAccount   用户账户
     * @param userPassword  用户密码
     * @param checkPassword 校验密码
     * @return 注册用户id
     */
    long userRegister(String userAccount, String userEmail, String userPassword, String checkPassword, String code);

    /**
     * 获取加密密码
     * @param password 原始密码
     * @return 加密后密码
     */
    String getEncryptPassword(String password);

    /**
     * 用户登录
     * @return 脱敏后的用户信息
     */
    LoginUserVO userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 获取当前登录用户
     * @param request 请求
     * @return 用户信息
     */
    User getLoginUser(HttpServletRequest request);

    /**
     * 获取脱敏后的用户信息
     * @param user 用户信息
     * @return 脱密后的用户信息
     */
    LoginUserVO getLoginUserVO(User user);
    /**
     * 用户注销
     * @param request 请求
     * @return 是否注销成功
     */
    Boolean userLogout(HttpServletRequest request);

    /**
     * 获取脱敏后的用户信息
     * @param user 用户信息
     * @return 脱敏后的用户信息
     */
    UserVO getUserVO(User user);

    /**
     * 获取脱敏后的用户列表
     * @param userList 用户列表
     * @return 脱敏后的用户列表
     */
    List<UserVO> getUserVOList(List<User> userList);

    /**
     * 拼接查询条件
     * @param userQueryRequest 查询请求
     * @return 查询条件
     */
    QueryWrapper<User> getQueryWrapper(UserQueryRequest userQueryRequest);

    /**
     * 用户修改个人信息
     * @param userInfoUpdateRequest 修改请求
     * @return 是否修改成功
     */
    Boolean userInfoUpdate(UserInfoUpdateRequest userInfoUpdateRequest);

    /**
     * 添加用户
     * @param userAddRequest 添加用户请求
     * @return 新增用户id
     */
    long addUser(UserAddRequest userAddRequest);

    /**
     * 根据id获取用户（仅管理员）
     * @param id 用户id
     * @return 用户信息
     */
    User getUserById(long id);

    /**
     * 根据id获取用户包装类
     * @param id 用户id
     * @return 用户信息
     */
    UserVO getUserVoById(long id);

    /**
     * 删除用户
     * @param deleteRequest 删除用户请求
     * @return 是否删除成功
     */
    boolean deleteUser(DeleteRequest deleteRequest);

    /**
     * 判断是否为管理员
     * @param user 用户
     * @return 是否为管理员
     */
    boolean isAdmin(User user);

    /**
     * 关注/取关
     * @param followRequest 关注/取关请求
     * @return 是否关注成功
     */
    Boolean userFollow(UserFollowRequest followRequest);

    /**
     * 发送私信
     * @param messageAddRequest 发送私信请求
     * @return 是否发送成功
     */
    Boolean sendMessage(MessageAddRequest messageAddRequest);

    /**
     * 用户获取私信列表
     * @param messageListRequest 私信列表请求
     * @return 私信列表
     */
    Page<MessageVO> getMessageByPage(MessageListRequest messageListRequest);

    /**
     * 获取关注列表(谁关注了自己)
     * @param userFollowRequest 关注列表请求
     * @return 关注列表
     */
    Page<FollowerVO> getFollowerByPage(UserFollowRequest userFollowRequest);

    /**
     * 获取关注列表（关注了谁）
     * @param userFollowRequest 关注列表请求
     * @return 关注列表
     */
    Page<FollowerVO> getFollowingByPage(UserFollowRequest userFollowRequest);

    /**
     * 邮箱发送测试
     * @param email 邮箱
     * @return 发送是否成功
     */
    String sendEmail(String email);
}
